package com.kclm.se.proxy.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**************
 * 
 * @author yejf
 * @since JDK8.0
 * @CreateDate 2020年8月27日 下午3:51:40 
 * @description 此类用来描述了cglib生成代理对象的过程
 *
 */
public interface CglibProxyFactory {

	/**********
	 * 利用CGLIB来生成目标对象的代理对象
	 * @param target
	 * @return
	 */
	static Object getProxyInstance(Object target) {
		//1. 创建Enhancer工具类
		Enhancer en = new Enhancer();
		//2.设置父类
		en.setSuperclass(target.getClass());
		//3. 设置回调函数
		en.setCallback(new MethodInterceptor() {
			
				@Override
				public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
					//
					System.out.println("调用目标方法之前：开始事务");
					// 调用目标方法[此方法中的参数必需是 target,不能写 obj】
					Object rtnValue = method.invoke(target, args);
					//
					System.out.println("调用目标方法之后：结束事务");
					//返回
					return rtnValue;
				}
			}
			);
		//4. 创建子类（代理对象）
		return en.create();
	}
}
